[Design pattern]: 设计模式相关系列
介绍
概念: 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时 , 所有依赖于它的对象都得到通知并被自动更新。
应用场景: 例如新闻订阅模式,邮件订阅等,客户端是观察者,新闻发布平台是被观察者,最重要的一点是被观察者控制着主动权. 注意区分的是:和时下的新闻APP并不相同,现在新闻APP采用的是客户端掌握了新闻更新的主动权.
好处: 一处改变,处处改变.
接来下实现一个游戏存档与读档的功能
CODE
在Java中有已经预定义好的发布-订阅模式的抽象类和接口,直接使用就好了.如果想要自己实现,源代码也很简单,仿写即可.JDK中定义的订阅者接口是java.util.Observer,发布者抽象类是java.util.Observable
下面编写实例
订阅者(观察者)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package note.com.observer;
import java.util.Observable; import java.util.Observer;
public class 新闻收听者 implements Observer{
private String name = ""; private String message = null;
public 新闻收听者(String name){ this.name = name; }
public void update(Observable o, Object arg) { this.setMessage((String)arg); System.out.println(name+":"+message); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
|
发布者(被观察者)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package note.com.observer;
import java.util.Observable;
public class 新闻发布者 extends Observable{
private String message = null;
public void releaseNews(String news){ this.setMessage(news); setChanged(); notifyObservers(news); }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
}
|
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package note.com.observer;
public class ObserverTest {
public static void main(String[] args) { 新闻发布者 from = new 新闻发布者(); 新闻收听者 to1 = new 新闻收听者("河南电视台"); 新闻收听者 to2 = new 新闻收听者("河北电视台"); 新闻收听者 to3 = new 新闻收听者("广东电视台"); 新闻收听者 to4 = new 新闻收听者("辽宁电视台"); from.addObserver(to1); from.addObserver(to2); from.addObserver(to3); from.addObserver(to4); from.releaseNews("国家农业税免收");
} }
|
结果
1 2 3 4
| 辽宁电视台:国家农业税免收 广东电视台:国家农业税免收 河北电视台:国家农业税免收 河南电视台:国家农业税免收
|
从例子中可以看到定义了4个订阅者,也就是四个电视台的对象和一个发布者.发布者更新新闻信息,四个电视台同时执行了update方法根据发布者的更新内容执行对应的更新操作.